package com.hyfrogx.common.utils;

import com.alibaba.druid.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

/**
 * TODO 获取真实IP的工具类
 *
 * @author crazypenguin
 * @version 1.0.0
 * @createdate 2019/1/2
 */
public class IPUtils {
	private static Logger logger = LoggerFactory.getLogger(IPUtils.class);
    //正式服
    private final static String IP = "10.141.186.75";
    //测试服
    private final static String TEXT_IP = "192.168.108.177";

	/**
	 * 获取IP地址
	 *
	 * 使用Nginx等反向代理软件， 则不能通过request.getRemoteAddr()获取IP地址
	 * 如果使用了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP地址，X-Forwarded-For中第一个非unknown的有效IP字符串，则为真实IP地址
	 */
	public static String getIpAddr(HttpServletRequest request) {
    	String ip = null;
        try {
            ip = request.getHeader("x-forwarded-for");
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
        	logger.error("IPUtils ERROR ", e);
        }

//        //使用代理，则获取第一个IP地址
//        if(StringUtils.isEmpty(ip) && ip.length() > 15) {
//			if(ip.indexOf(",") > 0) {
//				ip = ip.substring(0, ip.indexOf(","));
//			}
//		}

        return ip;
    }

    /**
     * 判断服务器的IP地址正确性
     * TRUE是测试服
     * false是正式服
     * @Title: checkIp
     * @Description: (这里用一句话描述这个方法的作用)
     * @param @return    设定文件
     * @return boolean    返回类型
     * @throws
     */
    public static boolean checkIp() {
        try {
            Enumeration<NetworkInterface> allNetInterfaces; // 定义网络接口枚举类
            allNetInterfaces = NetworkInterface.getNetworkInterfaces(); // 获得网络接口
            InetAddress ip = null; // 声明一个InetAddress类型ip地址
            while (allNetInterfaces.hasMoreElements()) // 遍历所有的网络接口
            {
                NetworkInterface netInterface = allNetInterfaces.nextElement();
                Enumeration<InetAddress> addresses = netInterface.getInetAddresses(); // 同样再定义网络地址枚举类
                while (addresses.hasMoreElements()) {
                    ip = addresses.nextElement();
                    if (ip != null && (ip instanceof Inet4Address)) // InetAddress类包括Inet4Address和Inet6Address
                    {
                        if ("eth0".equals(netInterface.getName())) {
                            String val = ip.getHostAddress();
                            System.out.println(val);
                            if (val.equals(TEXT_IP)) {
                                return false;
                            } else {
                                return true;
                            }
                        }
                    }
                }
            }
            return false;
        } catch (Exception e) {
            return false;
        }
    }

}
